نکته کلیدی قبل از دستورها
الآن چون فایل routes/telegraph.php را از داخل routes/api.php لود کرده‌ایم، لاراول به‌صورت پیش‌فرض روی مسیرهای api «پیشوند api/» می‌گذارد. پس مسیر نهایی وبهوک شما «/api/telegram/webhook» است، نه «/telegram/webhook». برای همین grep روی «/telegram/webhook/» چیزی برنگرداند.

اگر می‌خواهی مسیر وبهوک دقیقاً «/telegram/webhook» باشد، باید آن فایل را از web لود کنی (یا در RouteServiceProvider ثبتش کنی). اما فعلاً با همین وضعیت، وبهوک را روی «/api/telegram/webhook» ست کن.

دستورها (با توکن و سکرت مستقیم)

پاکسازی کش و دیدن روت
php artisan optimize:clear
php artisan route:list | grep -i telegram
انتظار: باید «POST api/telegram/webhook» را ببینی.
ست‌کردن وبهوک روی مسیر درست (با پیشوند api)
curl -sS -X POST "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/setWebhook"
-H "Content-Type: application/json"
-d '{"url":"https://lar.hanafi.vip/api/telegram/webhook","secret_token":"f35f1bfbad29a33309bdc2b1c761d6e0"}'
بررسی وضعیت وبهوک
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
تست دستی وبهوک روی سرور خودت (سلامت مسیر)
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook"
-H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0"
-H "Content-Type: application/json"
-d '{}'
انتظار: HTTP/200 و {"ok":true}
اگر می‌خواهی مسیر وبهوک «/telegram/webhook» (بدون /api) باشد

به‌جای لود کردن telegraph.php از داخل api.php، آن را از web.php (یا در RouteServiceProvider زیر گروه web) لود کن. آن‌وقت دستورات setWebhook/test را با URL:
https://lar.hanafi.vip/telegram/webhook
و همان secret_token اجرا کن.
اگر باز هم 404 از api.telegram.org گرفتی

404 از api.telegram.org معمولاً یعنی URL فراخوانی‌شده «bot{TOKEN}» توکن نداشته (متغیر خالی) یا URL اشتباه بوده. با دستورات بالا که توکن/سکرت صراحتاً در خود URL و payload آمده‌اند، این مشکل برطرف می‌شود.
این خروجی دستور هارو بررسی کن و ببین چطوره و یعنی چی و برم مرحله بعدی یا نه

[hanafivi@sahand lar.hanafi.vip]$ php artisan route:list | grep -i telegram
at app/Http/Controllers/TelegramWebhookController.php:23
[hanafivi@sahand lar.hanafi.vip]$ curl -X POST "https://api.telegram.org/bot$TELEGRAPH_TOKEN/setWebhook" -H "Content-Type: application/json" -d'{"url":"'"$APP_URL"'/telegram/webhook","secret_token":"'"$TELEGRAPH_SECRET"'"}'
{"ok":false,"error_code":404,"description":"Not Found"}[hanafivi@sahand lar.hanafi.vip]$ ^C
[hanafivi@sahand lar.hanafi.vip]$ curl "https://api.telegram.org/bot$TELEGRAPH_TOKEN/getWebhookInfo"
{"ok":false,"error_code":404,"description":"Not Found"}[hanafivi@sahand lar.hanafi.vip]$ ^C
[hanafivi@sahand lar.hanafi.vip]$ php artisan route:list | grep -F '/telegram/webhook'
[hanafivi@sahand lar.hanafi.vip]$ php artisan optimize:clear

INFO Clearing cached bootstrap files.

events ............................................................................................................................ 1ms DONE
views ............................................................................................................................. 1ms DONE
cache ............................................................................................................................. 0ms DONE
route ............................................................................................................................. 0ms DONE
config ............................................................................................................................ 0ms DONE
compiled .......................................................................................................................... 0ms DONE

[hanafivi@sahand lar.hanafi.vip]$ php artisan route:list | grep -i telegram
at app/Http/Controllers/TelegramWebhookController.php:23
[hanafivi@sahand lar.hanafi.vip]$


خوب پیش رفتی؛ ولی با همین خروجی‌ها هنوز نباید به مرحله بعد برویم. دو مسئله همزمان داری:

خطای 404 از api.telegram.org
علت: در شل از متغیرهای محیطی $TELEGRAPH_TOKEN/$APP_URL/$TELEGRAPH_SECRET استفاده کردی که در شل تعریف نشده‌اند، بنابراین URL به صورت bot/setWebhook (بدون توکن) فراخوانی شده و تلگرام 404 داده.
دوم اینکه چون telegraph.php را از routes/api.php لود کرده‌ایم، مسیر واقعی وبهوک «/api/telegram/webhook» است نه «/telegram/webhook». باید وبهوک را روی URL درست ست کنی.
خطای artisan route:list
خروجی "at app/Http/Controllers/TelegramWebhookController.php:23" یعنی هنگام لیست کردن روت‌ها یک خطا داخل آن فایل (نه حتماً داخل متد handle، ممکن است در ایمپورت‌ها/کد) رخ داده است. چون grep فقط خط اول خطا را نشان می‌دهد. این را هم باید تأیید کنیم، ولی حتی بدون route:list هم می‌توانی سلامت وبهوک را با curl مستقیم تست کنی.
دستورهای صحیح (با توکن و سکرت مستقیم، بدون متغیر شل)
چون الان telegraph.php زیر گروه api لود شده، مسیرت این است: /api/telegram/webhook

setWebhook
curl -sS -X POST "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/setWebhook"
-H "Content-Type: application/json"
-d '{"url":"https://lar.hanafi.vip/api/telegram/webhook","secret_token":"f35f1bfbad29a33309bdc2b1c761d6e0"}'

getWebhookInfo
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"

تست سلامت وبهوک روی سرور خودت
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook"
-H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0"
-H "Content-Type: application/json"
-d '{}'

انتظار نتایج

getWebhookInfo باید url = https://lar.hanafi.vip/api/telegram/webhook و last_error_message خالی را نشان دهد.
تست POST باید HTTP/200 و {"ok":true} برگرداند.
اگر می‌خواهی مسیر وبهوک بدون /api باشد

telegraph.php را از گروه web لود کن (یا در RouteServiceProvider با middleware('web'))؛ آن‌وقت همان دستورات را با URL /telegram/webhook اجرا کن.
درباره خطای route:list

فعلاً اول با curl بالا سلامت وبهوک را تأیید کن؛ اگر 200 گرفتی، مسیر ثبت است و می‌توانی ادامه بدهی.
برای دیدن جزئیات خطای route:list (اختیاری ولی بهتر است رفع شود):
php artisan route:list (بدون grep) تا استک‌تریس کامل را ببینی
یا tail -n 200 storage/logs/laravel.log
اگر خواستی، همین خروجی/استک‌تریس را بفرست تا دقیقاً بگویم خط 23 چه مشکلی دارد (اغلب یک use/namespace یا کد سطح فایل).
خط پایان فاز صفر

وقتی سه خروجی زیر سبز شد، آماده ورود به مراحل بعد هستی:
getWebhookInfo OK با URL درست (بدون خطا)
curl POST به وبهوک با هدر Secret → 200 {ok:true}
(اختیاری) artisan route:list بدون خطا، یا حداقل تأیید سلامت وبهوک با curl.
اگر الان setWebhook و تست POST را با دستورات بالا زد‌ه‌ای و موفق بود، بگو تا برویم مرحله بعدی (هسته تلگرام و آنبوردینگ).

[hanafivi@sahand lar.hanafi.vip]$ curl -sS -X POST "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/setWebhook"
-H "Content-Type: application/json"
-d '{"url":"https://lar.hanafi.vip/api/telegram/webhook","secret_token":"f35f1bfbad29a33309bdc2b1c761d6e0"}'

{"ok":true,"result":true,"description":"Webhook is already deleted"}bash: -H: command not found
bash: -d: command not found
[hanafivi@sahand lar.hanafi.vip]$


مشکل از نحوه زدن دستور بود، نه از تلگرام یا پروژه:

شما curl را در چند خط بدون backslash انتهای خطوط زدید. Bash سطر اول را اجرا کرد (بدون -H و -d) و تلگرام آن را به صورت setWebhook بدون پارامتر تفسیر کرد و وبهوک را حذف کرد؛ پیام “Webhook is already deleted” همین را می‌گوید.
سپس خطوط بعدی (-H و -d) جداگانه اجرا شدند و چون دستور نیستند، bash: -H: command not found داد.
کار درست: یا همه را در یک خط بزنید، یا اگر چند خط می‌زنید انتهای هر خط یک \ بگذارید.

دستور صحیح (تک‌خطی، با توکن و سکرت شما، روی مسیر فعلی /api/telegram/webhook)

ست‌کردن وبهوک:
curl -sS -X POST "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/setWebhook" -H "Content-Type: application/json" -d '{"url":"https://lar.hanafi.vip/api/telegram/webhook","secret_token":"f35f1bfbad29a33309bdc2b1c761d6e0"}'

بررسی وضعیت:
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"

تست سلامت وبهوک روی سرور خودتان:
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook" -H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0" -H "Content-Type: application/json" -d '{}'

نکته مسیر

چون telegraph.php را از routes/api.php لود کرده‌ایم، مسیر فعلی شما /api/telegram/webhook است (با پیشوند api). اگر بخواهید مسیر بدون /api باشد، باید فایل را از گروه web لود کنید و سپس وبهوک را روی https://lar.hanafi.vip/telegram/webhook ست کنید.
اگر ترجیح می‌دهید چندخطی بزنید، این شکل درست است (backslash انتهای خطوط):
curl -sS -X POST "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/setWebhook"
-H "Content-Type: application/json"
-d '{"url":"https://lar.hanafi.vip/api/telegram/webhook","secret_token":"f35f1bfbad29a33309bdc2b1c761d6e0"}'

پس از اجرای دستورات بالا:

getWebhookInfo باید url = https://lar.hanafi.vip/api/telegram/webhook را نشان بدهد و last_error_message خالی باشد.
تست POST باید HTTP/200 و {"ok":true} برگرداند.
اگر باز مشکلی دیدی، خروجی کامل getWebhookInfo و curl POST را بفرست تا مرحله بعد را تأیید کنم.
نتیجه این بود

[hanafivi@sahand lar.hanafi.vip]$ curl -sS -X POST "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/setWebhook" -H "Content-Type: application/json" -d '{"url":"https://lar.hanafi.vip/api/telegram/webhook","secret_token":"f35f1bfbad29a33309bdc2b1c761d6e0"}'
{"ok":true,"result":true,"description":"Webhook was set"}[hanafivi@sahand lar.hanafi.vip]$ ^C
[hanafivi@sahand lar.hanafi.vip]$ curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
{"ok":true,"result":{"url":"https://lar.hanafi.vip/api/telegram/webhook","has_custom_certificate":false,"pending_update_count":1,"last_error_date":1757893456,"last_error_message":"Wrong response from the webhook: 500 Internal Server Error","max_connections":40,"ip_address":"157.90.199.42"}}[hanafivi@sahand lar.hanafi.vipcurl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook" -H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0" -H "Content-Type: application/json" -d '{}'{}'

HTTP/2 500
x-powered-by: PHP/8.3.23
cache-control: no-cache, private
content-type: text/html; charset=UTF-8
access-control-allow-origin: *
date: Sun, 14 Sep 2025 23:45:01 GMT
alt-svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, quic=":443"; ma=2592000; v="43,46"

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Server Error</title>

    <style>
        /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}code{font-family:monospace,monospace;font-size:1em}[hidden]{display:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}a{color:inherit;text-decoration:inherit}code{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}svg,video{display:block;vertical-align:middle}video{max-width:100%;height:auto}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f7fafc;background-color:rgba(247,250,252,var(--bg-opacity))}.border-gray-200{--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#cbd5e0;border-color:rgba(203,213,224,var(--border-opacity))}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.flex{display:flex}.grid{display:grid}.hidden{display:none}.items-center{align-items:center}.justify-center{justify-content:center}.font-semibold{font-weight:600}.h-5{height:1.25rem}.h-8{height:2rem}.h-16{height:4rem}.text-sm{font-size:.875rem}.text-lg{font-size:1.125rem}.leading-7{line-height:1.75rem}.mx-auto{margin-left:auto;margin-right:auto}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.ml-2{margin-left:.5rem}.mt-4{margin-top:1rem}.ml-4{margin-left:1rem}.mt-8{margin-top:2rem}.ml-12{margin-left:3rem}.-mt-px{margin-top:-1px}.max-w-xl{max-width:36rem}.max-w-6xl{max-width:72rem}.min-h-screen{min-height:100vh}.overflow-hidden{overflow:hidden}.p-6{padding:1.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pt-8{padding-top:2rem}.fixed{position:fixed}.relative{position:relative}.top-0{top:0}.right-0{right:0}.shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.text-center{text-align:center}.text-gray-200{--text-opacity:1;color:#edf2f7;color:rgba(237,242,247,var(--text-opacity))}.text-gray-300{--text-opacity:1;color:#e2e8f0;color:rgba(226,232,240,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#718096;color:rgba(113,128,150,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#1a202c;color:rgba(26,32,44,var(--text-opacity))}.uppercase{text-transform:uppercase}.underline{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wider{letter-spacing:.05em}.w-5{width:1.25rem}.w-8{width:2rem}.w-auto{width:auto}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@keyframes ping{0%{transform:scale(1);opacity:1}75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:translateY(0);-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){.sm\:rounded-lg{border-radius:.5rem}.sm\:block{display:block}.sm\:items-center{align-items:center}.sm\:justify-start{justify-content:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:h-20{height:5rem}.sm\:ml-0{margin-left:0}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pt-0{padding-top:0}.sm\:text-left{text-align:left}.sm\:text-right{text-align:right}}@media (min-width:768px){.md\:border-t-0{border-top-width:0}.md\:border-l{border-left-width:1px}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}@media (prefers-color-scheme:dark){.dark\:bg-gray-800{--bg-opacity:1;background-color:#2d3748;background-color:rgba(45,55,72,var(--bg-opacity))}.dark\:bg-gray-900{--bg-opacity:1;background-color:#1a202c;background-color:rgba(26,32,44,var(--bg-opacity))}.dark\:border-gray-700{--border-opacity:1;border-color:#4a5568;border-color:rgba(74,85,104,var(--border-opacity))}.dark\:text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.dark\:text-gray-400{--text-opacity:1;color:#cbd5e0;color:rgba(203,213,224,var(--text-opacity))}}
    </style>

    <style>
        body {
            font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
        }
    </style>
</head>
<body class="antialiased">
    <div class="relative flex items-top justify-center min-h-screen bg-gray-100 dark:bg-gray-900 sm:items-center sm:pt-0">
        <div class="max-w-xl mx-auto sm:px-6 lg:px-8">
            <div class="flex items-center pt-8 sm:justify-start sm:pt-0">
                <div class="px-4 text-lg text-gray-500 border-r border-gray-400 tracking-wider">
                    500                    </div>

                <div class="ml-4 text-lg text-gray-500 uppercase tracking-wider">
                    Server Error                    </div>
            </div>
        </div>
    </div>
</body>
</html> [hanafivi@sahand lar.hanafi.vip]$

خوب جلو رفتی و الان سه نکته روشن است:

setWebhook موفق بود: {"ok":true,"result":true,"description":"Webhook was set"}
تلگرام خطای 500 از وبهوک شما گزارش می‌دهد: "Wrong response from the webhook: 500 Internal Server Error"
تست مستقیم POST به https://lar.hanafi.vip/api/telegram/webhook هم HTTP/500 برگردانده است.
یعنی وبهوک رجیستر است، اما داخل سرور لاراول شما Exception می‌خورد. در این مرحله به مرحله بعد نرو؛ اول همین 500 را برطرف کنیم.

تشخیص و اقدام

منطق کلی
اگر /api/telegram/webhook 500 بدهد، یا Controller خطا می‌دهد، یا config/read-header/namespace ایراد دارد. چون ما قبلاً مسیر را از routes/api.php لود کردیم، مسیر درست /api/telegram/webhook است (و همین را هم set کردی).
در کد فعلی، Secret Header چک می‌شود و در صورت mismatch باید 401 بدهد، نه 500. پس 500 یعنی Exception رخ داده (مثلاً use/namespace/type-hint یا خطای کدنویسی).
لاگ را ببین (برای اینکه بدانیم دقیقاً کجاست)
tail -n 200 storage/logs/laravel.log
php artisan route:list (بدون grep) تا اگر همان “at app/Http/Controllers/TelegramWebhookController.php:23” را نشان می‌دهد، استکتریس کامل را ببینیم.
همین خروجی‌ها را بده تا خط دقیق را pinpoint کنم.
یک فیکس سریع و مقاوم برای وبهوک (پیشنهاد پچ)
حتی بدون دیدن لاگ، می‌توانیم وبهوک را “ایمن در برابر خطا” کنیم تا تلگرام 200 بگیرد و صف خطاها متوقف شود. این کار هم مشکل را لاپوشانی نمی‌کند؛ ما در عین حال خطا را در لاگ ثبت می‌کنیم.
فایل: app/Http/Controllers/TelegramWebhookController.php
جایگزین کردن متد handle با نسخه مقاوم زیر (بدون تغییر بقیه کد):
public function handle(\Illuminate\Http\Request $request)
{
try {
$expected = config('telegraph.bots.default.secret');
$provided = $request->header('X-Telegram-Bot-Api-Secret-Token')
?? $request->header('X-Telegram-Secret-Token')
?? $request->header('X-Telegraph-Secret');

    if ($expected && $provided !== $expected) {
        // برگرداندن 401 برای تست دستی؛ اگر خواستی می‌توانیم به 200 تغییر دهیم تا تلگرام هم ناراحت نشود
        return response()->json(['error' => 'unauthorized'], 401);
    }

    // TODO: اینجا بعداً parse update و dispatch واقعی را می‌گذاریم
    return response()->json(['ok' => true], 200);
} catch (\Throwable $e) {
    \Log::error('telegram webhook error', [
        'msg' => $e->getMessage(),
        'line' => $e->getLine(),
        'file' => $e->getFile(),
    ]);
    // برای جلوگیری از retryهای پیاپی تلگرام، بهتر است 200 بدهیم
    return response()->json(['ok' => true], 200);
}
}

نکات پچ:

از type-hintهای کلاس‌ها در امضای متد (مثلاً JsonResponse) صرف نظر کردم تا اگر use/namespace در محیط سرور مشکل داشت، Fatal نشود.
در catch، 200 می‌دهیم تا تلگرام خطایی نبیند، اما در حالت موفق با Secret معتبر هم 200 می‌دهیم.
اگر Secret نامعتبر باشد، موقتاً 401 برمی‌گردانیم (می‌توانیم در محیط production هم 200 بدهیم و فقط log کنیم تا تلگرام retry نکند؛ انتخاب با شماست).
بعد از پچ
php artisan route:clear
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook" -H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0" -H "Content-Type: application/json" -d '{}'
انتظار: HTTP/200 و {"ok":true}
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
انتظار: last_error_message حذف شود یا حداقل بعد از یک بار تماس موفق دیگر تکرار نشود.
اگر می‌خواهی مسیر بدون /api باشد
به‌جای بارگذاری از routes/api.php، فایل routes/telegraph.php را از گروه web لود کن (یا در RouteServiceProvider قرار بده)، و سپس setWebhook را روی https://lar.hanafi.vip/telegram/webhook تنظیم کن. تا وقتی از api.php لود می‌شود، مسیر درست همان /api/telegram/webhook است و باید از همان استفاده کنی.
جمع‌بندی وضعیت فعلی تو

setWebhook درست است (OK).
500 از وبهوک داخلی باید سریعاً رفع شود (پچ بالا + بررسی لاگ برای جزئیات).
بعد از 200 شدن پاسخ وبهوک، می‌توانیم به مرحله بعدی (هسته تلگرام و آنبوردینگ) برویم.
اگر می‌خواهی من همین پچ را اعمال کنم، تأیید بده تا انجام دهم؛ یا اگر ترجیح می‌دهی خودت کپی کنی، بعد از اعمال به من بگو تا تست‌های curl را دوباره انجام دهیم.

نتیجه این بود
[hanafivi@sahand lar.hanafi.vip]$ tail -n 200 storage/logs/laravel.log
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:44:13] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:44:29] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:45:01] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:45:02] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:46:06] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[hanafivi@sahand lar.hanafi.vip]$

[hanafivi@sahand lar.hanafi.vip]$ php artisan route:list

ParseError

syntax error, unexpected token ""

at app/Http/Controllers/TelegramWebhookController.php:23
19▕ }
20▕ // Emit Start for pilot (bind to debug user if provided)
21▕ try {
22▕ $uid = (int) ($request->header('X-Debug-User') ?: 1);
➜ 23▕ \App\Services\Analytics\EventBus::track($uid, 'Start', []);
24▕ } catch (\Throwable) {}
25▕ // TODO: Parse Telegraph update and dispatch to handlers (no logic yet)
26▕ return response()->json(['ok' => true]);
27▕ }

  +1 vendor frames
2 [internal]:0
Composer\Autoload\ClassLoader::loadClass()
+6 vendor frames

9 [internal]:0
Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console{closure}()

[hanafivi@sahand lar.hanafi.vip]$

بررسی کن خروجی ببین چیه


تشخیص شفاف

خطای 500 و خطای artisan route:list هر دو به یک ریشه برمی‌گردند: خطای نحوی (ParseError) داخل فایل app/Http/Controllers/TelegramWebhookController.php در خط 23.
لاگ نشان می‌دهد در این فایل بک‌اسلش‌ها به‌اشتباه «دوتایی» نوشته شده‌اند و مفسر PHP به “unexpected token \” خورده است:
قطعه مشکل‌دار (از لاگ)
22: $uid = (int) ($request->header('X-Debug-User') ?: 1);
23: \App\Services\Analytics\EventBus::track($uid, 'Start', []);
24: } catch (\Throwable) {}

در PHP باید از یک بک‌اسلش \ به‌عنوان جداکننده namespace استفاده شود، نه \ که فقط در رشته‌های escape لازم می‌شود. همین دوتایی بودن باعث ParseError شده است.
راه‌حل دقیق (بدون تغییرات دیگر)

اصلاح بک‌اسلش‌ها در کنترلر:
\App\Services\Analytics\EventBus → \App\Services\Analytics\EventBus
\Throwable → \Throwable
پیشنهاد بازنویسی متد (ایمن و مینیمال)

در app/Http/Controllers/TelegramWebhookController.php متد handle را به شکل زیر اصلاح کن (اگر فقط می‌خواهی خطا رفع شود، همین دو خط کافی است؛ اگر می‌خواهی نسخه مقاوم‌تر شود، این بلوک را کامل جایگزین کن):
public function handle(\Illuminate\Http\Request $request)
{
try {
$expected = config('telegraph.bots.default.secret');
$provided = $request->header('X-Telegram-Bot-Api-Secret-Token')
?? $request->header('X-Telegram-Secret-Token')
?? $request->header('X-Telegraph-Secret');

    if ($expected && $provided !== $expected) {
        // در صورت تمایل می‌توانی در محیط production به‌جای 401 کد 200 بدهی تا تلگرام retry نکند
        return response()->json(['error' => 'unauthorized'], 401);
    }

    // نمونه رویداد شروع (اختیاری، برای پایش زنده)
    try {
        $uid = (int) ($request->header('X-Debug-User') ?: 1);
        \App\Services\Analytics\EventBus::track($uid, 'Start', []);
    } catch (\Throwable $e) {
        \Log::warning('event track failed', ['err' => $e->getMessage()]);
    }

    // TODO: اینجا بعداً parse update و dispatch واقعی را می‌گذاریم
    return response()->json(['ok' => true]);
} catch (\Throwable $e) {
    \Log::error('telegram webhook error', [
        'msg' => $e->getMessage(),
        'line' => $e->getLine(),
        'file' => $e->getFile(),
    ]);
    // برای جلوگیری از retryهای پیاپی تلگرام، بهتر است 200 بدهیم
    return response()->json(['ok' => true]);
}
}

دلیل این نسخه

بک‌اسلش‌ها درست شده‌اند (namespaceها با ).
خطاهای احتمالی داخل متد را لاگ می‌کنیم ولی به تلگرام 200 برمی‌گردانیم تا صف retry تلگرام پر نشود.
بررسی Secret header پابرجاست (اگر Secret اشتباه باشد 401 می‌دهد؛ در production می‌شود به 200 تغییر داد و فقط لاگ کرد).
گام‌های تست بعد از اصلاح

پاک‌سازی کش و لیست روت‌ها
php artisan optimize:clear
php artisan route:list | grep -i telegram
انتظار: POST api/telegram/webhook (چون telegraph.php را از api.php لود کرده‌ای)
تست سلامت وبهوک محلی
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook"
-H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0"
-H "Content-Type: application/json"
-d '{}'
انتظار: HTTP/200 و {"ok":true}
بررسی وضعیت در تلگرام
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
انتظار: url = https://lar.hanafi.vip/api/telegram/webhook و last_error_message پاک/عدم نمایش. اگر هنوز last_error_date دیده می‌شود، با یک یا دو call موفق به وبهوک پاک می‌شود.
نکات

چون telegraph.php از routes/api.php لود شده، مسیر شما الان /api/telegram/webhook است. اگر مسیر بدون /api می‌خواهی، telegraph.php را در گروه web لود کن یا در RouteServiceProvider ثبت کن و سپس setWebhook را به /telegram/webhook تغییر بده.
pending_update_count=1 طبیعی است چون تلگرام سعی کرده پیام را برساند و 500 گرفته؛ با پاسخ 200 و عبور کردن آپدیت‌ها، عدد کاهش می‌یابد.
مواردی که نیاز به اقدام ندارند

.env شما برای این مرحله کافی است؛ نیازی به افزودن کلید جدید نیست.
setWebhook را درست انجام داده‌اید؛ فقط باید 500 داخل سرور رفع شود (با اصلاح بک‌اسلش‌ها) تا last_error_message برطرف گردد.
اگر خواستی، دقیقاً بگو خط 23 فعلی کنترلر چگونه است تا نسخه اصلاح‌شده را خط‌به‌خط با همان سبک جایگزین کنیم.

تغیری که گفتی و نیاز هست در کد اعمال کن


تغیری که گفتی و نیاز هست در کد اعمال کن
C:\Users\asus\OneDrive\Documents\GitHub\hajibot\app\Http\Controllers\TelegramWebhookController.php

اینم بررسی کن و مشکلشو حل کن


تغییرات لازم را در کد اعمال کردم و خطای نحوی را برطرف کردم. اکنون وبهوک باید به‌جای 500، پاسخ 200 بدهد.

چه اصلاح شد

فایل: app/Http/Controllers/TelegramWebhookController.php
بک‌اسلش‌های اشتباه (\) به بک‌اسلش صحیح () تبدیل شد.
متد handle با try/catch مقاوم شد:
بررسی Secret header (X-Telegram-Bot-Api-Secret-Token و معادل‌ها)
ثبت رویداد آزمایشی Start (اختیاری) با EventBus (اگر هدر X-Debug-User باشد/نیست، 1)
لاگ اخطار/خطا با Log facade (با FQCN)
در صورت بروز خطا، 200 برمی‌گرداند تا تلگرام retry استورم ندهد.
چه کارهایی الان شما انجام دهید (تست و تأیید)

پاکسازی کش:
php artisan optimize:clear
تست سلامت وبهوک (روی سرور خودت):
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook"
-H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0"
-H "Content-Type: application/json"
-d '{}'
انتظار: HTTP/200 و {"ok":true}
بررسی وضعیت تلگرام:
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
انتظار: url همان https://lar.hanafi.vip/api/telegram/webhook و last_error_message دیگر تکرار نشود (یا پس از چند تماس موفق پاک شود).
اگر خواستی route‌ها را ببینی:
php artisan route:list | grep -i telegram
چون routes/telegraph.php از داخل api.php لود شده، مسیر فعلی /api/telegram/webhook است (وجود «api/» طبیعی است).
اگر نتیجه curl هنوز خطا داشت، خروجی کامل curl و tail -n 200 storage/logs/laravel.log را بفرست تا سریع بررسی کنم.

1 file changed

Undo

View changes
TelegramWebhookController.php
+28
-14

نتیجه این بود

"}}[hanafivi@sahand lar.hanafi.vipcurl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook" -H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0" -H "Content-Type: application/json" -d '{}'

HTTP/2 200
x-powered-by: PHP/8.3.23
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
access-control-allow-origin: *
date: Sun, 14 Sep 2025 23:57:15 GMT
alt-svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, quic=":443"; ma=2592000; v="43,46"

{"ok":true}[hanafivi@sahand lar.hanafi.vip]$ curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo" curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
{"ok":true,"result":{"url":"https://lar.hanafi.vip/api/telegram/webhook","has_custom_certificate":false,"pending_update_count":0,"last_error_date":1757894043,"last_error_message":"Wrong response from the webhook: 500 Internal Server Error","max_connections":40,"ip_address":"157.90.199.42"}}[hanafivi@sahand lar.hanafi.vip]$


عالی — الان فاز وبهوک سالم است.

آنچه می‌بینیم

تست مستقیم وبهوک شما 200 و {"ok":true} برگردانده: یعنی مسیر /api/telegram/webhook درست کار می‌کند و Secret هم پذیرفته شده.
getWebhookInfo هنوز last_error_message=500 نشان می‌دهد، ولی pending_update_count=0 است. این یعنی آخرین تلاش ناموفق قبلی (قبل از فیکس) در حافظه تلگرام ثبت است؛ خطای جدیدی رخ نداده و آپدیت معوقی هم نیست.
چرا هنوز last_error_message می‌بینی؟

Telegram این دو فیلد را تا زمانی که “یک تلاش جدید” انجام نشود آپدیت نمی‌کند. چون pending_update_count=0 است، تلگرام تلاشی برای ارسال آپدیت نکرده، بنابراین آخرین خطای قبلی هنوز همانجا دیده می‌شود. کافی است یک پیام واقعی به بات بفرستی تا یک بار Update ارسال شود؛ اگر 200 بگیرد، getWebhookInfo دیگر پیغامی از خطای جدید نشان نخواهد داد (last_error_date به‌روز نمی‌شود).
قدم نهایی برای اطمینان

داخل تلگرام، به ربات پیام بده (مثلاً /start یا هر متن ساده).
دوباره بررسی:
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
انتظار: pending_update_count دوباره صفر بماند و last_error_date جدید اضافه نشود. اگر همچنان last_error_message نمایش داده می‌شود ولی تاریخش تغییر نکرده، یعنی مشکل جدیدی نیست؛ آن پیام مربوط به قبل از فیکس است.
لاگ لاراول را برای 200/OK بررسی کن (اختیاری):
tail -n 100 storage/logs/laravel.log
نکات مفید

مسیر فعلی وبهوک /api/telegram/webhook است چون routes/telegraph.php را از api.php لود کرده‌ایم. همین باید باقی بماند مگر اینکه بخواهی بدون /api باشد (در آن صورت telegraph.php را از گروه web یا RouteServiceProvider زیر middleware web لود می‌کنیم و setWebhook را به /telegram/webhook تغییر می‌دهیم).
اگر بخواهی صف آپدیت‌های معوق (اگر روزی معوق شد) پاک شود، می‌توانی هنگام setWebhook از پارامتر drop_pending_updates:true هم استفاده کنی؛ ولی الان pending=0 است و نیازی نیست.
جمع‌بندی وضعیت

وبهوک: OK (200)
setWebhook: OK
last_error_message: متعلق به قبل از فیکس؛ با اولین تعامل واقعی بات پاک می‌شود (یا حداقل به‌روز نمی‌شود و قابل نادیده‌گرفتن است).
می‌توانیم به مرحله بعد (هسته بات و آنبوردینگ) حرکت کنیم.
اگر پیام /start را ارسال کردی و getWebhookInfo را مجدد گرفتی، خروجی را بفرست تا تایید نهایی سلامت را بدهیم.

الان مشکل وبهوک حل شده یعنی ؟


بله — از نظر اتصال و مسیر، وبهوک الان سالم است.

شواهد سلامت

ست وبهوک موفق: Webhook was set
مسیر درست و Secret درست: curl POST به https://lar.hanafi.vip/api/telegram/webhook با هدر Secret → HTTP/200 و {"ok":true}
getWebhookInfo نشان می‌دهد url روی /api/telegram/webhook ست است و pending_update_count = 0
درباره last_error_message

پیام “Wrong response … 500” مربوط به تلاش‌های قبل از فیکس است. تلگرام این فیلد را تا وقتی آپدیت جدیدی ارسال نشود، به همان مقدار “آخرین خطا” نگه می‌دارد. کافی است یک پیام واقعی (/start) به بات بفرستی تا یک آپدیت جدید ارسال شود؛ اگر وبهوک 200 بدهد، دیگر last_error_date به‌روز نمی‌شود و خطای جدیدی ثبت نمی‌شود (و عملاً سالم است).
اگر می‌خواهی دوباره چک کنی

ارسال پیام به بات (مثلاً /start)، سپس:
curl -sS "https://api.telegram.org/bot<توکن>/getWebhookInfo"
انتظار: pending_update_count صفر بماند، last_error_date جدید اضافه نشود
نکته مسیر

چون routes/telegraph.php را از routes/api.php لود کرده‌ایم، مسیر فعلی /api/telegram/webhook است. اگر بخواهی بدون /api باشد، بعداً می‌توانیم آن را در گروه web رجیستر کنیم و setWebhook را به /telegram/webhook تغییر بدهیم.
نتیجه

اتصال وبهوک OK، می‌توانیم به مرحله بعد (پیاده‌سازی هسته ربات و آنبوردینگ) برویم.
الان دوباره /start زدم

بعد وبهوک چک کردم اینو گفت

"}}[hanafivi@sahand lar.hanafi.vip]$ curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
{"ok":true,"result":{"url":"https://lar.hanafi.vip/api/telegram/webhook","has_custom_certificate":false,"pending_update_count":0,"last_error_date":1757894043,"last_error_message":"Wrong response from the webhook: 500 Internal Server Error","max_connections":40,"ip_address":"157.90.199.42"}}[hanafivi@sahand lar.hanafi.vip]$

لاگ لاراولم اینو میگه

"}}[hanafivi@sahand lar.hanafi.viptail -n 100 storage/logs/laravel.loglog
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:52:54] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:53:59] production.ERROR: syntax error, unexpected token "" {"exception":"[object] (ParseError(code: 0): syntax error, unexpected token "\" at /home/hanafivi/lar.hanafi.vip/app/Http/Controllers/TelegramWebhookController.php:23)
[stacktrace]
#0 /home/hanafivi/lar.hanafi.vip/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}()
#1 [internal function]: Composer\Autoload\ClassLoader->loadClass()
#2 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1096): is_a()
#3 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Route.php(1035): Illuminate\Routing\Route->controllerMiddleware()
#4 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(818): Illuminate\Routing\Route->gatherMiddleware()
#5 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\Routing\Router->gatherRouteMiddleware()
#6 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(784): Illuminate\Routing\Router->runRouteWithinStack()
#7 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(748): Illuminate\Routing\Router->runRoute()
#8 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Routing/Router.php(737): Illuminate\Routing\Router->dispatchToRoute()
#9 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#10 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(144): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#11 /home/hanafivi/lar.hanafi.vip/vendor/livewire/livewire/src/Features/SupportDisablingBackButtonCache/DisableBackButtonCacheMiddleware.php(19): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#12 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Livewire\Features\SupportDisablingBackButtonCache\DisableBackButtonCacheMiddleware->handle()
#13 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#14 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#15 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#16 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#17 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#18 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#19 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#20 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#21 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#22 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#23 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#24 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\HandleCors->handle()
#25 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(183): Illuminate\Http\Middleware\TrustProxies->handle()
#27 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(119): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#29 /home/hanafivi/lar.hanafi.vip/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#30 /home/hanafivi/lar.hanafi.vip/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle()
#31 {main}
"}
[2025-09-14 23:55:59] production.WARNING: event track failed {"err":"SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or updatea child row: a foreign key constraint fails (hanafivi_haji.events, CONSTRAINT events_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE) (Connection: mysql, SQL: insert into events (user_id, type, payload_json, created_at, updated_at) values (1, Start, [], 2025-09-14 23:55:59, 2025-09-14 23:55:59))"}
[2025-09-14 23:57:15] production.WARNING: event track failed {"err":"SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or updatea child row: a foreign key constraint fails (hanafivi_haji.events, CONSTRAINT events_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE) (Connection: mysql, SQL: insert into events (user_id, type, payload_json, created_at, updated_at) values (1, Start, [], 2025-09-14 23:57:15, 2025-09-14 23:57:15))"}
[2025-09-15 00:01:59] production.WARNING: event track failed {"err":"SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or updatea child row: a foreign key constraint fails (hanafivi_haji.events, CONSTRAINT events_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE) (Connection: mysql, SQL: insert into events (user_id, type, payload_json, created_at, updated_at) values (1, Start, [], 2025-09-15 00:01:59, 2025-09-15 00:01:59))"}
[2025-09-15 18:29:00] production.WARNING: event track failed {"err":"SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or updatea child row: a foreign key constraint fails (hanafivi_haji.events, CONSTRAINT events_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE) (Connection: mysql, SQL: insert into events (user_id, type, payload_json, created_at, updated_at) values (1, Start, [], 2025-09-15 18:29:00, 2025-09-15 18:29:00))"}
[hanafivi@sahand lar.hanafi.vip]$


خوب پیش رفتی. الان وضعیت این‌طوری است:

وبهوک سالم است: POST به /api/telegram/webhook با Secret → 200 و {"ok":true}.
getWebhookInfo هنوز last_error_message=500 را نشان می‌دهد، اما این مربوط به «قبل از فیکس» است؛ چون pending_update_count=0 و تاریخ last_error_date عوض نشده، خطای جدیدی ثبت نشده. با اولین آپدیت واقعی (مثل /start) که 200 بگیرد، مقدار جدیدی ثبت نمی‌شود و می‌توان نادیده گرفت.
دلیل WARN در لاگ

هشدارهای لاگ (event track failed … FK constraint) به‌خاطر این است که کنترلر برای پایش زنده یک رویداد Start ثبت می‌کند و به‌صورت پیش‌فرض از user_id=1 استفاده می‌کند، اما در جدول users رکوردی با id=1 وجود ندارد. به همین دلیل FK روی events.user_id خطا می‌دهد.
خود وبهوک 200 می‌دهد (چون در catch، 200 برمی‌گردانیم تا تلگرام retry نکند)، اما EventBus::track شکست را به‌عنوان WARNING لاگ می‌کند.
سه راه حل سریع (بدون تغییر کد، یکی را انتخاب کن)

روش A — اضافه‌کردن هدر X-Debug-User با id معتبر

اگر رکوردی در users داری، id آن را در هدر بفرست تا رویداد به همان user وصل شود:
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook"
-H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0"
-H "X-Debug-User: <existing_user_id>"
-H "Content-Type: application/json"
-d '{}'
با این کار WARNING از بین می‌رود.
روش B — ساخت یک کاربر آزمایشی و استفاده از id آن در هدر

در MySQL:
INSERT INTO users (tg_id, created_at, updated_at) VALUES ('debug', NOW(), NOW());
SELECT id FROM users WHERE tg_id='debug';
سپس همان id را در هدر X-Debug-User بفرست (مثل روش A).
روش C — ایجاد user با id=1 (فقط اگر مطمئنی تداخلی با دیتا ندارد)

اگر قصد داری هدر نفرستی و همان پیش‌فرض 1 باقی بماند، می‌توانی کاربر id=1 بسازی:
INSERT INTO users (id, tg_id, created_at, updated_at) VALUES (1, 'system', NOW(), NOW())
ON DUPLICATE KEY UPDATE tg_id=tg_id;
توجه: اگر Auto Increment و داده‌ای وجود دارد، بهتر است روش B را استفاده کنی تا با PK موجود تداخلی نداشته باشد.
برای اطمینان نهایی

یک /start واقعی در تلگرام بزن (یا تماس POST از curl با هدر debug) و سپس:
curl -sS "https://api.telegram.org/bot…/getWebhookInfo"
اگر last_error_date تغییری نکرد، یعنی دیگر خطایی رخ نمی‌دهد و وضعیت سبز است.
tail -n 100 storage/logs/laravel.log
باید WARNING مربوط به FK قطع شود (وقتی user_id معتبر بفرستی).
نکته مسیر

چون telegraph.php را از routes/api.php لود کرده‌ایم، مسیر وبهوک /api/telegram/webhook است. اگر مسیر «/telegram/webhook» (بدون /api) را ترجیح می‌دهی، بعداً فایل را در گروه web رجیستر می‌کنیم و setWebhook را به URL جدید تغییر می‌دهیم.
آماده‌ایم برای مرحله بعد

وبهوک اکنون OK است. اگر دوست داری، می‌رویم سراغ «هسته تلگرام و آنبوردینگ» طبق TELEGRAM_UX.md (جریان نقش/شهر/بودجه/فرکانس، منوی پویا)؛ یا اگر می‌خواهی همین حالا WARNING را ساکت کنیم، یکی از سه روش بالا را انتخاب کن و خروجی‌ها را بفرست تا تأیید کنم.
[hanafivi@sahand lar.hanafi.vip]$ curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook" -H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0" -H "X-Debug-User: 239053159" -H "Content-Type: application/json" -d '{}'
HTTP/2 200
x-powered-by: PHP/8.3.23
cache-control: no-cache, private
content-type: application/json
x-ratelimit-limit: 60
x-ratelimit-remaining: 59
access-control-allow-origin: *
date: Mon, 15 Sep 2025 18:34:17 GMT
alt-svc: h3=":443"; ma=2592000, h3-29=":443"; ma=2592000, h3-Q050=":443"; ma=2592000, h3-Q046=":443"; ma=2592000, h3-Q043=":443"; ma=2592000, quic=":443"; ma=2592000; v="43,46"

با کاربری خودم زدم اینو گفت ، انقدرم اگه مگه نگو هر آپشنی که به من میگی دقیق باید توضیح بدی یعنی چی


خلاصه نتیجه تست تو

پاسخ 200 از curl به /api/telegram/webhook یعنی وبهوک و Secret کاملاً سالمند. این دقیقاً همان چیزی است که باید ببینیم.
معنی دقیق گزینه‌هایی که استفاده کردی

X-Telegram-Bot-Api-Secret-Token: هِدری که تلگرام هنگام ارسال وبهوک می‌فرستد. ما در سرور چک می‌کنیم که مقدار آن با TELEGRAPH_SECRET یکی باشد. برای تست دستی هم باید همین را بفرستی تا 200 بگیری.
X-Debug-User: هدر تستی (فقط برای دیباگ/هلس‌چک) که من در کنترلر گذاشته‌ام تا یک رویداد Start در جدول events ثبت کنیم. مقدار آن باید شناسه داخلی کاربر در DB (users.id) باشد، نه Telegram ID. اگر users.id موجود نباشد، به‌خاطر FK روی events.user_id، ثبت رویداد شکست می‌خورد (WARNING در لاگ) ولی پاسخ 200 باقی می‌ماند.
چرا WARNING در لاگ می‌بینی؟

تو X-Debug-User: 239053159 فرستادی. این عدد Telegram ID تو است، اما در DB داخل جدول users، ستون کلید اصلی id است که معمولاً عددی کوچک و Auto Increment است. چون users.id=239053159 وجود ندارد، درج رویداد به‌خاطر FK خطا می‌دهد:
Cannot add or update a child row: a foreign key constraint fails (events.user_id → users.id)
چطور WARNING را حذف کنی (سه مسیر واضح؛ یکی را انتخاب کن)

مسیر 1 — استفاده از users.id واقعی خودت (ترجیحی)

ابتدا شناسه داخلی خودت را پیدا کن:
در MySQL:
SELECT id FROM users WHERE tg_id='239053159';
اگر نتیجه خالی بود، اول بساز:
INSERT INTO users (tg_id, created_at, updated_at) VALUES ('239053159', NOW(), NOW());
حالا دوباره SELECT id … بزن و id را بردار.
تست دوباره وبهوک با هِدر درست (id داخلی، نه Telegram ID):
curl -i -X POST "https://lar.hanafi.vip/api/telegram/webhook"
-H "X-Telegram-Bot-Api-Secret-Token: f35f1bfbad29a33309bdc2b1c761d6e0"
-H "X-Debug-User: <users.id که از کوئری گرفتی>"
-H "Content-Type: application/json"
-d '{}'
بررسی لاگ: tail -n 100 storage/logs/laravel.log
دیگر WARNING مربوط به FK نباید بیاید. در جدول events هم یک ردیف type=Start برای همین id می‌بینی.
مسیر 2 — ساخت کاربر آزمایشی اختصاصی

INSERT INTO users (tg_id, created_at, updated_at) VALUES ('debug', NOW(), NOW());
SELECT id FROM users WHERE tg_id='debug';
همان id را در X-Debug-User استفاده کن (مثل بالا).
مسیر 3 — استفاده از id=1 (فقط اگر مطمئنی)

اگر بخواهی بدون Koچینگ هدر، همان پیش‌فرض 1 را نگه داری، می‌توانی مطمئن شوی users.id=1 وجود دارد:
INSERT INTO users (id, tg_id, created_at, updated_at) VALUES (1, 'system', NOW(), NOW()) ON DUPLICATE KEY UPDATE tg_id=tg_id;
توصیه من: مسیر 1 (یافتن id واقعی از tg_id) به‌مراتب سالم‌تر است.
نکته مهم درباره getWebhookInfo

هنوز last_error_message: 500 را می‌بینی چون مربوط به تلاش‌های قبل از فیکس است. این مقدار تا زمانی که تلگرام یک آپدیت جدید ارسال نکند، در حافظه‌اش «آخرین خطا» را نشان می‌دهد. وقتی یک /start واقعی به بات بزنی و ما 200 بدهیم (که الان می‌دهیم)، اگر خطای جدیدی رخ ندهد:
pending_update_count صفر می‌ماند
last_error_date دیگر به‌روز نمی‌شود
همین یعنی سالم است؛ نیازی نیست نگران باشی.
یک‌بار دیگر دقیق تست کن (برای اطمینان نهایی)

در تلگرام، برای ربات /start بفرست.
سپس:
curl -sS "https://api.telegram.org/bot7382889700:AAHYWSXHbQKUunHLURpy742f4cbBjzAzZMo/getWebhookInfo"
انتظار: pending_update_count=0 و last_error_date تغییر نکرده باشد (یا خطای جدیدی ثبت نشده باشد).
و برای تست رویداد (اختیاری):
طبق مسیر 1 یک users.id معتبر بگیر و X-Debug-User را همان بفرست؛ بعد:
SELECT * FROM events ORDER BY id DESC LIMIT 1; باید type=Start برای آن id را ببینی.
اگر می‌خواهی دیگر این هدر تستی را هم نداشته باشی، بگو تا حذفش کنم (ولی برای هلس‌چک خیلی کمک می‌کند). از اینجا به بعد می‌تونیم برویم سراغ فاز بعدی: پیاده‌سازی هسته بات (آنبوردینگ نقش/شهر/بودجه/فرکانس) و هندل‌های اصلی — بگو اول کدام را می‌خواهی جلو ببریم.

این شناسه کاربری واقعی خودمه که اینجا استفاده کردم و با همین شناسه تلگرام /start زدم

چرا در دیتابیس اضافه نشدم؟ چون هنوز کد کامل نیست؟

و نکته بعدی اینکه در تمام مراحل توسعه تا زمانی که من نگفتم باید سیستم لاگ کامل و دقیق و با جزئیات بالا ، وجود داشته باشه همه چیز لاگ بندازه کامل و غیر فعال نشه

اینو تو مستندات پروژه ام اضافه کن


stream disconnected before completion: Your input exceeds the context window of this model. Please adjust your input and try again.
2 files changed
+67
-0

Undo

View changes
LOGGING_POLICY.md
+66
-0

RUNBOOK.md
+1
-0

تمام مراحل توسعه تا زمانی که من نگفتم باید سیستم لاگ کامل و دقیق و با جزئیات بالا ، وجود داشته باشه همه چیز لاگ بندازه کامل و غیر فعال نشه

اینو تو مستندات پروژه ام اضافه کن


stream disconnected before completion: Your input exceeds the context window of this model. Please adjust your input and try again.

